# Полезные практики от опытных разработчиков ## Переопределение checkWorkAbility() В `checkWorkAbility` нельзя использовать: - `thisRop()`, заместо этого лучше использовать `getVar/getSelfVar` - обходчики, особенно с инвалидацией в БД (запросом на согласование данных в БД) (например, `refreshByParent()` ). Нужно понимать, что `checkWorkAbility` вызывается часто, поэтому его оптимизация сильно сказывается на времени работы бизнес-логики. ## session.flush() заместо session.commit() `session.commit()` лучше избегать и использовать `session.flush()`. `commit()` выгружает данные из кэша в БД. `flush()` применяет изменения сессии к БД. В случае использования `flush()` данные ещё не в БД и есть возможность откатить изменения, например, в случае ошибки. `commit()` вызывает `afterEdit()` с проверкой обязательных полей в отличии от `flush()`. ## Избегать использование [Option].get и [Collection].head Не использовать для: - Option `.get`, если внутри был `None`, то выпадет исключение. Использовать `.getOrElse(<значение или исключение, в случае None>)`. - коллекций .head без проверки на пустоту коллекции. лучше использовать `.headOption`, что вернёт результат в конструкции `Option`, который дальше распаковать через `.getOrElse()`. ## Миксин Btk_Object миксин Btk_Object хранит все записи классов супер-типа документ и справочник. В него нельзя вносить изменения! Это системный миксин.